#include "jsontosrtprocessor.h"
#include <QDebug>
#include <QDir>
#include <QFile>
#include <QJsonDocument>
#include <QJsonObject>
#include <QTextStream>

bool JsonToSrtProcessor::processJsonToSrt(const QString &jsonPath, const QString &sourceSrtPath,
                                          const QString &translatedSrtPath)
{
    try
    {
        // 读取JSON文件
        QJsonArray jsonArray = readJsonFile(jsonPath);
        if (jsonArray.isEmpty())
        {
            qDebug() << "JSON文件为空或无效";
            return false;
        }

        // 确保输出目录存在
        QDir().mkpath(QFileInfo(sourceSrtPath).path());
        QDir().mkpath(QFileInfo(translatedSrtPath).path());

        // 生成SRT文件
        if (!generateSrtContent(jsonArray, sourceSrtPath, translatedSrtPath))
        {
            return false;
        }

        qDebug() << "JSON转换为SRT文件完成";
        return true;
    }
    catch (const std::exception &e)
    {
        qDebug() << "处理JSON文件时发生错误:" << e.what();
        return false;
    }
}

QJsonArray JsonToSrtProcessor::readJsonFile(const QString &filePath)
{
    QFile file(filePath);
    if (!file.open(QIODevice::ReadOnly))
    {
        qDebug() << "无法打开JSON文件:" << filePath;
        return QJsonArray();
    }

    QByteArray jsonData = file.readAll();
    file.close();

    QJsonDocument doc = QJsonDocument::fromJson(jsonData);
    if (!doc.isArray())
    {
        qDebug() << "JSON文件格式不正确，应为数组格式";
        return QJsonArray();
    }

    return doc.array();
}

bool JsonToSrtProcessor::generateSrtContent(const QJsonArray &jsonArray, const QString &sourcePath,
                                            const QString &translatedPath)
{
    QStringList sourceTexts;
    QStringList translatedTexts;

    // 从JSON数组中提取文本
    for (const QJsonValue &value : jsonArray)
    {
        if (!value.isObject())
            continue;

        QJsonObject obj = value.toObject();
        QString input   = obj["input"].toString();
        QString output  = obj["output"].toString();

        if (!input.isEmpty() && !output.isEmpty())
        {
            sourceTexts.append(input);
            translatedTexts.append(output);
        }
    }

    // 生成源语言SRT文件
    QFile sourceFile(sourcePath);
    if (!sourceFile.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << "无法创建源语言SRT文件:" << sourcePath;
        return false;
    }
    QTextStream sourceOut(&sourceFile);
    sourceOut << formatToSrt(sourceTexts);
    sourceFile.close();

    // 生成翻译语言SRT文件
    QFile translatedFile(translatedPath);
    if (!translatedFile.open(QIODevice::WriteOnly | QIODevice::Text))
    {
        qDebug() << "无法创建翻译语言SRT文件:" << translatedPath;
        return false;
    }
    QTextStream translatedOut(&translatedFile);
    translatedOut << formatToSrt(translatedTexts);
    translatedFile.close();

    return true;
}

QString JsonToSrtProcessor::formatToSrt(const QStringList &texts)
{
    QString srtContent;
    int index        = 1;
    int hours        = 0;
    int minutes      = 0;
    int seconds      = 0;
    int milliseconds = 0;

    for (const QString &text : texts)
    {
        if (text.trimmed().isEmpty())
            continue;

        // 格式化时间戳
        QString startTime = QString("%1:%2:%3,%4")
                                .arg(hours, 2, 10, QChar('0'))
                                .arg(minutes, 2, 10, QChar('0'))
                                .arg(seconds, 2, 10, QChar('0'))
                                .arg(milliseconds, 3, 10, QChar('0'));

        // 每个字幕显示3秒
        seconds += 3;
        if (seconds >= 60)
        {
            minutes += seconds / 60;
            seconds = seconds % 60;
        }
        if (minutes >= 60)
        {
            hours += minutes / 60;
            minutes = minutes % 60;
        }

        QString endTime = QString("%1:%2:%3,%4")
                              .arg(hours, 2, 10, QChar('0'))
                              .arg(minutes, 2, 10, QChar('0'))
                              .arg(seconds, 2, 10, QChar('0'))
                              .arg(milliseconds, 3, 10, QChar('0'));

        // 添加SRT条目
        srtContent += QString("%1\n%2 --> %3\n%4\n\n")
                          .arg(index)
                          .arg(startTime)
                          .arg(endTime)
                          .arg(text.trimmed());

        index++;
    }

    return srtContent;
}